home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dprint / menusel.c < prev    next >
Text File  |  1994-05-09  |  2KB  |  108 lines

  1. /*
  2.  
  3. 8086|Printman/POSTCARD Version 1.00a
  4. 選択肢入力処理ルーチン
  5.  
  6. Copyright (c) 1993 Delmonta
  7. */
  8.  
  9. #include<string.h>
  10. #include<ctype.h>
  11. #include"dprint.h"
  12.  
  13. static    struct MENUDAT    *Menu;
  14. static    int        Selectpos;
  15.  
  16. /*---------------------------------------------------------------------------*/
  17.  
  18. static    void    putchoices(int pos)
  19. {
  20.     if    (pos == Selectpos)
  21.     {
  22.         printf("\033[%d;1f\033[2K%s\033[7m",ERRMES_LINE-1,
  23.                         Menu[pos].explain);
  24.     }
  25.  
  26.     printf("\033[%d;5f%c・%s\033[0m",pos+SYSLINE_START+2,
  27.                 Menu[pos].headchar,Menu[pos].tbl);
  28. }
  29.  
  30. /*---------------------------------------------------------------------------*/
  31.  
  32. static    void    dpsel_end(void)
  33. {
  34.     unsigned    i;
  35.  
  36.     printf("\033[%d;1f",SYSLINE_START);
  37.  
  38.     for    (i=SYSLINE_START ; i<ERRMES_LINE ; i++)
  39.         printf("\033[2K\n");
  40. }
  41.  
  42. /*---------------------------------------------------------------------------*/
  43.  
  44. int    dp_menuselect(char *mes,unsigned num,struct MENUDAT menu[])
  45. {
  46.     int        i;
  47.     char        c;
  48.  
  49.     Menu      = menu;    /* 値を下請けの関数と共有するための配慮 */
  50.  
  51.     Selectpos = 0; 
  52.  
  53.     printf("\033[%d;1f%s",SYSLINE_START,mes);
  54.  
  55.  
  56.             /* コンソール本来のカーソルが画面上に残るため    */
  57.             /* いちばん上の行を最後に表示したい        */
  58.     for    (i=num-1 ; i>=0 ; i--)
  59.         putchoices(i);
  60.  
  61. dpsel_rep:
  62.     c = dp_getch();
  63.  
  64.     if    (c==EXTKEY_H)
  65.     {
  66.         dp_getch();
  67.         goto dpsel_rep;
  68.     }
  69.  
  70.     if    (c==UPKEY && Selectpos>0)    /* 上カーソルキー */
  71.     {
  72.         putchoices(Selectpos--);
  73.         putchoices(Selectpos  );
  74.     }
  75.     else if    (c==DOWNKEY && Selectpos<num-1)    /* 下カーソルキー */
  76.     {
  77.         putchoices(Selectpos++);
  78.         putchoices(Selectpos  );
  79.     }
  80.     else if    (c=='\033')
  81.     {
  82.         dpsel_end();
  83.         return -1;
  84.     }
  85.     else if    (c=='\r')
  86.     {
  87.         dpsel_end();
  88.         return Selectpos;
  89.     }
  90.     else
  91.     {
  92.         c = toupper(c);
  93.  
  94.         for    (i=0 ; i<num ; i++)
  95.         {
  96.             if    (c==Menu[i].headchar)
  97.             {
  98.                 dpsel_end();
  99.                 return i;
  100.             }
  101.         }
  102.  
  103.         putchar('\7');
  104.     }
  105.  
  106.     goto dpsel_rep;
  107. }
  108.